package com.gemini.main.common.orm.jpa.repository;

import com.gemini.main.common.orm.jpa.bean.PageFilter;
import com.gemini.main.common.orm.jpa.bean.Filter;

import java.util.List;
import java.util.Map;

/**
 * Wisdytech.cn
 * com.wisdytech.jpa.common.BaseCustomRepository
 *
 * @author hailin.zhl
 * @date 2018/11/02
 */
public interface BaseCustomRepository {


    /**
     * @param jpql       jpql语句
     * @param countJpql  jpql语句
     * @param parameters 查询参数
     * @param type       类型
     * @param <T>        泛型
     * @return list
     */
    <T> List<T> findPageByJqpl(String jpql, String countJpql, Map<String, Object> parameters, PageFilter pageFilter, Class<T> type);

    /**
     * @param jpql       jpql语句
     * @param parameters 查询参数
     * @param type       类型
     * @param <T>        泛型
     * @return list
     */
    <T> List<T> findByJqpl(String jpql, Map<String, Object> parameters, Class<T> type);

    /**
     * 原生sql查询
     *
     * @param sql        原生sql 语句
     * @param parameters 查询参数
     * @param type       返回对象类型Class
     * @param <M>        返回对象类型
     * @return M
     */
    <M> List<M> findBySql(String sql, Map<String, Object> parameters, Class<M> type);

    /**
     * 原生sql查询 不要使用*查询
     *
     * @param sql        原生sql 语句
     * @param parameters 查询参数
     * @param type       返回对象类型Class
     * @param <M>        返回对象类型
     * @return M
     */
    <M> M findUniqueBySql(String sql, Map<String, Object> parameters, Class<M> type);

    /**
     * Execute an update or delete statement.
     *
     *
     * @param sql        sql语句
     * @param parameters 参数
     *
     * @return the number of entities updated or deleted
     */
    Integer executeUpdate(String sql, Map<String, Object> parameters);

    /**
     * @param sql    sql语句
     * @param filter 查询filter
     * @return list
     * @deprecated {@link #findPagesListBySql(String, Map, PageFilter, Class)} instead.
     */
    @Deprecated
    List<Map<String, Object>> findPagesListBySql(String sql, Filter filter);

    /**
     * @param sql    sql语句
     * @param filter 查询filter
     * @return list
     */
    <E> List<E> findPagesListBySql(String sql, Map<String, Object> paramters, PageFilter filter, Class<E> type);
}
